home *** CD-ROM | disk | FTP | other *** search
- ;void exchange_data(seg1, ofs1, seg2, ofs2, number_bytes);
- ; unsigned short seg1, ofs1, seg2, ofs2, number_bytes;
-
- EXTRN _memory_model:byte
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _exchange_data
- _exchange_data proc near
- push di ;
- push si ;
- push bp ;save BP
- mov bp,sp ;set stack frame
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bp ;else add 2 to BP
- inc bp ;
- begin: push ds ;save Turbo's data seg
- mov ax,[bp+4] ;get segment of area 1
- mov ds,ax ;place in DS
- mov si,[bp+6] ;get offset of area 1
- mov ax,[bp+8] ;get segment of area 2
- mov es,ax ;place in ES
- mov di,[bp+10] ;get offset of area 2
- mov cx,[bp+12] ;number bytes to exchange
- mov dx,cx ;keep copy in DX
- shr cx,1 ;copy 2 bytes at a time
- cld ;direction flag forward
- jcxz L2 ;jump if 1 or 0 bytes
- L1: mov bx,es:[di] ;get byte from area 2
- mov ax,[si] ;get byte from area 1
- mov [si],bx ;set byte in area 1
- stosw ;set byte in area 2
- inc si ;forward ptr
- inc si ;again
- loop L1 ;loop till finished
- L2: test dx,1 ;is Bytes an odd number?
- jz L3 ;quit if not
- mov bl,es:[di] ;get last byte of area 2
- mov al,[si] ;get last byte of area 1
- mov es:[di],al ;place one final byte
- mov [si],bl ;place other final byte
- L3: pop ds ;restore registers
- pop bp ;
- pop si ;
- pop di ;
- cmp _memory_model,0 ;quit
- jle Quit ;
- db 0CBh ;RET far
- Quit: ret ;RET near
- _exchange_data endp
- _TEXT ENDS
- END